// 接口：在TypeScript里，接口的作用就是为这些类型命名和为你的代码或第三方代码定义契约。
// 1. 处理对象
interface User {
  // 必须属性
  user: string;
  // 只读属性
  readonly sex: "男" | "女";
  // 可选属性
  age?: number;
  // 额外属性
  [propsName: string]: any;
}

let obj: User = {
  user: "张三",
  age: 18,
  sex: "男",
};

// 2. 函数类型
// 变量声明  类型     赋值
let str: string = "123";

// 接口函数类型
interface Add {
  (a: number, b: number): number;
}

// 函数类型
let add: Add;
let add1: (a: number, b: number) => number;

// 函数体
add = (x: number, y: number) => {
  return x + y;
};

add1 = (x: number, y: number) => {
  return x + y;
};

// 3. 接口索引(数组)类型
// interface Arr {
//   [propsName: number]: string | number | boolean
// }

// const arr: string[] = ["1", "2", "3"];

// const arr2: Arr = ["1", "2", "3", "4", 123, true];

// const arr1: Array<number> = [1, 2, 3, 4];

// 4. 接口类
interface AnimalType {
  name: "猫" | "狗";
  sex: "公" | "母";
}

// 语法： class 类名 implements 接口
class Animal implements AnimalType {
  name: "猫" | "狗";
  sex: "公" | "母";
  constructor(name: "猫" | "狗", sex: "公" | "母") {
    this.name = name;
    this.sex = sex;
  }
}

const cat = new Animal("猫", "母");
const dog = new Animal("狗", "公");
